package com.linkhub.oms.common.util;

import org.apache.commons.lang3.StringUtils;

import java.time.*;
import java.time.format.DateTimeFormatter;

/**
 * @Description: OffSetDateTimeUtil
 * @Author: echo
 * @Date: 2024/3/23 12:22
 * @Version: 1.0
 */
public class OffSetDateTimeUtil {

    public static final DateTimeFormatter ISO = DateTimeFormatter.ISO_OFFSET_DATE_TIME;


    public static LocalDateTime convertISO8601ToUTCDateTime(String dateStr) {
        if (StringUtils.isBlank(dateStr)) {
            return null;
        }
        // 将 ISO 8601 时间字符串解析为 OffsetDateTime 对象
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateStr, ISO);
        // 将 OffsetDateTime 转换为 LocalDateTime
        return offsetDateTime.atZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
    }

    public static String plusShopifyUpdateAtOneSeconds(String updateAtTime) {
        if (StringUtils.isBlank(updateAtTime)) {
            return updateAtTime;
        }
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(updateAtTime, ISO);
        OffsetDateTime plusSeconds = offsetDateTime.plusSeconds(1L);
        return plusSeconds.format(ISO);
    }

    public static LocalDateTime nowWithBeijingZone() {
        return now(ZoneId.of("Asia/Shanghai"));
    }

    public static LocalDateTime now(ZoneId zoneId) {
        return LocalDateTime.now(zoneId);
    }

    public static String getDateThreeMonthsAgo() {
        // 获取服务器默认时区
        ZoneId systemZone = ZoneId.systemDefault();
        // 获取当前时间
        OffsetDateTime now = OffsetDateTime.now(systemZone);
        // 计算三个月前的日期
        OffsetDateTime threeMonthsAgo = now.minusMonths(3).withNano(0);
        // 将日期格式化为指定的ISO 8601格式
        return threeMonthsAgo.format(ISO);
    }

    // 转换时间或者获取当前时间
    public static String getFormattedTime(String time) {
        if (time == null || time.isEmpty()) {
            // 如果为空，则返回当前的 ISO 8601 格式时间，包括时区偏移（Asia/Shanghai），不包含毫秒
            ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
            return now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX"));
        } else {
            // 如果不为空，尝试转换为 ISO 8601 格式
            try {
                DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                LocalDateTime parsedDate = LocalDateTime.parse(time, inputFormatter);

                // 将 LocalDateTime 转换为 Asia/Shanghai 时区的 ZonedDateTime
                ZonedDateTime zonedDateTime = parsedDate.atZone(ZoneId.of("Asia/Shanghai"));
                return zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX"));
            } catch (Exception e) {
                // 如果解析失败，则返回当前时间
                System.err.println("Invalid date format: " + time);
                ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
                return now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX"));
            }
        }
    }

    public static void main(String[] args) {
        // 测试获取三个月前的日期
        String dateThreeMonthsAgo = getDateThreeMonthsAgo();
        System.out.println(dateThreeMonthsAgo);
    }
}
